package org.versly.rest.wsdoc.impl;
import org.versly.rest.wsdoc.AnnotationProcessor;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
public class JaxRSRestImplementationSupport implements AnnotationProcessor.RestImplementationSupport {
@Override
public Class<? extends Annotation> getMappingAnnotationType() {
return Path.class;
}
@Override
public String[] getRequestPaths(ExecutableElement executableElement, TypeElement contextClass) {
Path anno = executableElement.getAnnotation(Path.class);
if (anno == null)
throw new IllegalStateException(String.format(
"The Path annotation for %s.%s is not parseable. Exactly one value is required.",
contextClass.getQualifiedName(), executableElement.getSimpleName()));
else
return new String[] { anno.value() };
}
@Override
public String[] getRequestPaths(TypeElement cls) {
Path clsAnno = cls.getAnnotation(Path.class);
if (clsAnno == null)
return new String[0];
else
return new String[] { clsAnno.value() };
}
@Override
public String getRequestMethod(ExecutableElement executableElement, TypeElement contextClass) {
List<String> methods = new ArrayList<String>();
gatherMethod(executableElement, methods, GET.class);
gatherMethod(executableElement, methods, PUT.class);
gatherMethod(executableElement, methods, POST.class);
gatherMethod(executableElement, methods, DELETE.class);
if (methods.size() != 1)
throw new IllegalStateException(String.format(
"The method annotation for %s.%s is not parseable. Exactly one request method (GET/POST/PUT/DELETE) is required. Found: %s",
contextClass.getQualifiedName(), executableElement.getSimpleName(), methods));
return methods.get(0);
}
private void gatherMethod(ExecutableElement executableElement, List<String> methods, Class<? extends Annotation> anno) {
if (executableElement.getAnnotation(anno) != null) {
methods.add(anno.getSimpleName());
}
}
@Override
public String getPathVariable(VariableElement var) {
PathParam param = var.getAnnotation(PathParam.class);
return param == null ? null : param.value();
}
@Override
public String getRequestParam(VariableElement var) {
QueryParam param = var.getAnnotation(QueryParam.class);
return param == null ? null : param.value();
}
@Override
public String getPojoRequestParam(VariableElement var) {
return null; // Not sure if this concept exists with JaxRS
}
@Override
public boolean isRequestBody(VariableElement var) {
return var.getAnnotationMirrors().size() == 0;
}
}